package Steuerung;

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import Darstellung.GUI;
import Darstellung.Objekte.JObjekt;
import Darstellung.Objekte.JTasche;
import Darstellung.Steuerung.SteuerungDarstellung;
import Spiel.Game;
import Spiel.Spieler;
import Spiel.Objekte.FOrt;
import Spiel.Objekte.IObjekt;
import Spiel.Objekte.IOrt;
import Spiel.Steuerung.SteuerungSpiel;
import Spiel.Werte.FDimension;
import Spiel.Werte.FWeg;
import Spiel.Werte.IDimension;
import Spiel.Werte.IWeg;

public class SteuerungHardware {

	public static void manipulationDurchTastatur() {
		System.out.print("Tastatur Steuerung" + "\n");
		GUI.getFenster().addKeyListener(new KeyListener() {
			@Override
			public void keyPressed(KeyEvent ke) {
				if (ke.getKeyCode() == KeyEvent.VK_W) {
					SteuerungKonfiguration.gehtHoch = true;
				}
				if (ke.getKeyCode() == KeyEvent.VK_S) {
					SteuerungKonfiguration.gehtRunter = true;
				}
				if (ke.getKeyCode() == KeyEvent.VK_A) {
					SteuerungKonfiguration.gehtLinks = true;
				}
				if (ke.getKeyCode() == KeyEvent.VK_D) {
					SteuerungKonfiguration.gehtRechts = true;
				}
				if (ke.getKeyCode() == KeyEvent.VK_SPACE) {
					SteuerungKonfiguration.nehmen = true;
				}
			}

			@Override
			public void keyReleased(KeyEvent ke) {
				if (ke.getKeyCode() == KeyEvent.VK_W) {
					SteuerungKonfiguration.gehtHoch = false;
				}
				if (ke.getKeyCode() == KeyEvent.VK_S) {
					SteuerungKonfiguration.gehtRunter = false;
				}
				if (ke.getKeyCode() == KeyEvent.VK_A) {
					SteuerungKonfiguration.gehtLinks = false;
				}
				if (ke.getKeyCode() == KeyEvent.VK_D) {
					SteuerungKonfiguration.gehtRechts = false;
				}
				if (ke.getKeyCode() == KeyEvent.VK_SPACE) {
					SteuerungKonfiguration.nehmen = false;
				}
			}

			@Override
			public void keyTyped(KeyEvent ke) {

			}
		});
		Thread t = new Thread() {
			@Override
			public void run() {
				while (GUI.getFenster().isShowing()) {
					if (!GUI.getFenster().isActive()) {
						SteuerungKonfiguration.gehtHoch = false;
						SteuerungKonfiguration.gehtRunter = false;
						SteuerungKonfiguration.gehtLinks = false;
						SteuerungKonfiguration.gehtRechts = false;
					}
					Spieler spieler = Game.getSpieler();
					IObjekt objektPlayer = spieler.getObjekt();
					IOrt ort = Game.getOrt();

					int xVal = 0;
					int yVal = 0;
					if (SteuerungKonfiguration.gehtHoch) {
						yVal += -2;
					}
					if (SteuerungKonfiguration.gehtRunter) {
						yVal += +2;
					}
					if (SteuerungKonfiguration.gehtLinks) {
						xVal += -2;
					}
					if (SteuerungKonfiguration.gehtRechts) {
						xVal += +2;
					}
					if (SteuerungKonfiguration.nehmen) {
						IObjekt objektKollision = SteuerungSpiel
								.sucheKollisionObjekt(ort, objektPlayer);
						if (objektKollision != null) {
							System.out.print("Nehme "
									+ objektKollision.getName() + "\n");
							spieler.getTasche().addObjekt(objektKollision);
							((JTasche) GUI.getSpielfenster()
									.getBenutzerSchnittstellen().get(2))
									.inhaltAktuallisieren();
							SteuerungSpiel.entferneObjektVonOrt(ort,
									objektKollision);
							JObjekt jobjektKollision = SteuerungDarstellung
									.sucheKollisionJObjekt(
											GUI.getSpielfenster(),
											objektKollision);
							if (jobjektKollision != null) {
								SteuerungDarstellung
										.entferneObjektVonOrt(
												GUI.getSpielfenster(),
												jobjektKollision);
							}
						}
					}

					IWeg weg = FWeg.weg(xVal, yVal, 0);
					SteuerungSpiel.bewegeObjekt(objektPlayer, weg);
					if (!FOrt.istImOrt(ort, objektPlayer)) {
						SteuerungSpiel.bewegeObjekt(objektPlayer,
								FWeg.invariant(weg));
					}
					try {
						Thread.sleep(SteuerungKonfiguration.erneuerungsRate);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		};
		t.start();
	}

	public static void test() {
		Thread t = new Thread() {
			@Override
			public void run() {
				int xVal = 1;
				int yVal = 3;
				int bVal = 3;
				int hVal = 2;
				while (GUI.getFenster().isShowing()) {
					IObjekt o = Game.getSpieler().getObjekt();
					int x = (int) o.getX();
					int y = (int) o.getY();
					int b = (int) o.getBreite();
					int h = (int) o.getHoehe();

					int cr = (int) (Math.random() * 1000 % 255);
					int cg = (int) (Math.random() * 1000 % 255);
					int cb = (int) (Math.random() * 1000 % 255);

					if (x > GUI.getSpielfenster().getWidth() - b) {
						xVal = -2;
						GUI.getPlayer().setBackground(new Color(cr, cg, cb));
					}
					if (x < 0) {
						xVal = 1;
						GUI.getPlayer().setBackground(new Color(cr, cg, cb));
					}
					if (y > GUI.getSpielfenster().getHeight() - h) {
						yVal = -3;
						GUI.getPlayer().setBackground(new Color(cr, cg, cb));
					}
					if (y < 0) {
						yVal = 3;
						GUI.getPlayer().setBackground(new Color(cr, cg, cb));
					}
					if (b > GUI.getSpielfenster().getWidth() - x) {
						bVal = -2;
						GUI.getPlayer().setBackground(new Color(cr, cg, cb));
					}
					if (b < 0 + 50) {
						bVal = 3;
						GUI.getPlayer().setBackground(new Color(cr, cg, cb));
					}
					if (h > GUI.getSpielfenster().getHeight() - y) {
						hVal = -1;
						GUI.getPlayer().setBackground(new Color(cr, cg, cb));
					}
					if (h < 0 + 50) {
						hVal = 2;
						GUI.getPlayer().setBackground(new Color(cr, cg, cb));
					}

					IDimension d = FDimension.dimension(bVal, hVal, 0);
					SteuerungSpiel.manipuliereObjekt(o, d);

					IWeg weg = FWeg.weg(xVal, yVal, 0);
					SteuerungSpiel.bewegeObjekt(o, weg);
					try {
						Thread.sleep(SteuerungKonfiguration.erneuerungsRate);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		};
		t.start();
	}
}
